home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
021-030
/
amok28
/
turtle
/
turtle.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
8KB
|
313 lines
(*---------------------------------------------------------------------------
:Program. Turtle.mod
:Author. Manfred Weigl
:Address. Mitteldorf 17, D-8435-Dietfurt
:Phone. 08464/417
:History. V1.0, 05-aug-89
:Copyright. PD
:Language. Modula-II
:Translator. M2Amiga
:Contents. PROCEDUREs für die Turtlegrafik
---------------------------------------------------------------------------*)
IMPLEMENTATION MODULE Turtle;
FROM SYSTEM IMPORT ADR, FFP;
FROM Graphics IMPORT RastPortPtr, Draw, Move, SetAPen, Text, WritePixel,
ReadPixel, DrawModes, DrawModeSet, SetDrMd;
FROM Intuition IMPORT ScreenPtr, WindowPtr;
FROM MathTrans IMPORT Sin, Cos;
FROM Strings IMPORT Length;
VAR
Turtle : RECORD
x, y : FFP;
heading,
color,
size : INTEGER;
pendown,
showturtle : BOOLEAN;
rp : RastPortPtr;
END;
(********* Private Prozeduren, nicht zum importieren bestimmt *********)
PROCEDURE rad (a : INTEGER) : FFP;
BEGIN
RETURN FFP(a) * 3.14159265/180.0;
END rad;
PROCEDURE int (x : FFP) : INTEGER;
BEGIN
RETURN INTEGER(x+0.5);
END int;
PROCEDURE DrawTurtle;
BEGIN
IF Turtle.showturtle THEN
SetDrMd(Turtle.rp, DrawModeSet{complement});
SetAPen(Turtle.rp, Turtle.color);
Move(Turtle.rp, int(Turtle.x), int(Turtle.y));
Draw(Turtle.rp,
int(Turtle.x + FFP(Turtle.size) * Sin(rad(Turtle.heading))),
int(Turtle.y - FFP(Turtle.size) * Cos(rad(Turtle.heading))));
Draw(Turtle.rp,
int(Turtle.x + FFP(Turtle.size) * Sin(rad(Turtle.heading+120))),
int(Turtle.y - FFP(Turtle.size) * Cos(rad(Turtle.heading+120))));
Draw(Turtle.rp,
int(Turtle.x + FFP(Turtle.size) * Sin(rad(Turtle.heading+240))),
int(Turtle.y - FFP(Turtle.size) * Cos(rad(Turtle.heading+240))));
Draw(Turtle.rp,
int(Turtle.x + FFP(Turtle.size) * Sin(rad(Turtle.heading))),
int(Turtle.y - FFP(Turtle.size) * Cos(rad(Turtle.heading))));
SetDrMd(Turtle.rp, DrawModeSet{});
END;
END DrawTurtle;
(********* aber jetzt gehts los mit der Turtlegrafik *********)
PROCEDURE InitTurtle (rp : RastPortPtr);
BEGIN
Turtle.x := 0.0;
Turtle.y := 0.0;
Turtle.heading := 0;
Turtle.color := 1;
Turtle.size := 10;
Turtle.pendown := TRUE;
Turtle.showturtle := TRUE;
Turtle.rp := rp;
DrawTurtle;
END InitTurtle;
PROCEDURE InitTurtleScr (sp : ScreenPtr);
BEGIN
InitTurtle(ADR(sp^.rastPort));
END InitTurtleScr;
PROCEDURE InitTurtleWin (wp : WindowPtr);
BEGIN
InitTurtle(wp^.rPort);
END InitTurtleWin;
PROCEDURE Home;
BEGIN
DrawTurtle;
IF Turtle.pendown THEN
SetAPen (Turtle.rp, Turtle.color);
Move (Turtle.rp, int(Turtle.x), int(Turtle.y));
Draw (Turtle.rp, 0, 0);
END;
Turtle.x := 0.0;
Turtle.y := 0.0;
Turtle.heading := 0;
DrawTurtle;
END Home;
PROCEDURE Forward (Laenge : INTEGER);
BEGIN
DrawTurtle;
IF Turtle.pendown THEN
SetAPen (Turtle.rp, Turtle.color);
Move (Turtle.rp, int(Turtle.x), int(Turtle.y));
Turtle.x := Turtle.x + FFP(Laenge) * Sin(rad(Turtle.heading));
Turtle.y := Turtle.y - FFP(Laenge) * Cos(rad(Turtle.heading));
Draw (Turtle.rp, int(Turtle.x), int(Turtle.y));
ELSE
Turtle.x := Turtle.x + FFP(Laenge) * Sin(rad(Turtle.heading));
Turtle.y := Turtle.y - FFP(Laenge) * Cos(rad(Turtle.heading));
END;
DrawTurtle;
END Forward;
PROCEDURE Back (Laenge : INTEGER);
BEGIN
DrawTurtle;
IF Turtle.pendown THEN
SetAPen (Turtle.rp, Turtle.color);
Move (Turtle.rp, int(Turtle.x), int(Turtle.y));
Turtle.x := Turtle.x - FFP(Laenge) * Sin(rad(Turtle.heading));
Turtle.y := Turtle.y + FFP(Laenge) * Cos(rad(Turtle.heading));
Draw (Turtle.rp, int(Turtle.x), int(Turtle.y));
ELSE
Turtle.x := Turtle.x - FFP(Laenge) * Sin(rad(Turtle.heading));
Turtle.y := Turtle.y + FFP(Laenge) * Cos(rad(Turtle.heading));
END;
DrawTurtle;
END Back;
PROCEDURE Left (Winkel : INTEGER);
BEGIN
DrawTurtle;
Turtle.heading := Turtle.heading - Winkel;
DrawTurtle;
END Left;
PROCEDURE Right (Winkel : INTEGER);
BEGIN
DrawTurtle;
Turtle.heading := Turtle.heading + Winkel;
DrawTurtle;
END Right;
PROCEDURE SetXY (x, y : INTEGER);
BEGIN
DrawTurtle;
IF Turtle.pendown THEN
SetAPen (Turtle.rp, Turtle.color);
Move (Turtle.rp, int(Turtle.x), int(Turtle.y));
Draw (Turtle.rp, x, y);
END;
Turtle.x := FFP(x);
Turtle.y := FFP(y);
DrawTurtle;
END SetXY;
PROCEDURE SetHeading (Winkel : INTEGER);
BEGIN
DrawTurtle;
Turtle.heading := Winkel;
DrawTurtle;
END SetHeading;
PROCEDURE PenUp;
BEGIN
Turtle.pendown := FALSE;
END PenUp;
PROCEDURE PenDown;
BEGIN
Turtle.pendown := TRUE;
END PenDown;
PROCEDURE ShowTurtle;
BEGIN
IF NOT Turtle.showturtle THEN
Turtle.showturtle := TRUE;
DrawTurtle;
ELSE
Turtle.showturtle := TRUE;
END;
END ShowTurtle;
PROCEDURE HideTurtle;
BEGIN
DrawTurtle;
Turtle.showturtle := FALSE;
END HideTurtle;
PROCEDURE SizeTurtle(n : INTEGER);
BEGIN
DrawTurtle;
Turtle.size := n;
DrawTurtle;
END SizeTurtle;
PROCEDURE PenColor (Farbe : INTEGER);
BEGIN
Turtle.color := Farbe;
END PenColor;
PROCEDURE Plot (x, y : INTEGER);
VAR dummy : LONGINT;
BEGIN
SetAPen (Turtle.rp, Turtle.color);
dummy := WritePixel(Turtle.rp, x, y);
END Plot;
PROCEDURE PlotText (x, y : INTEGER; text : ARRAY OF CHAR);
BEGIN
SetAPen (Turtle.rp, Turtle.color);
Move (Turtle.rp, x, y);
Text (Turtle.rp, ADR(text), Length(text));
END PlotText;
PROCEDURE WriteText (text : ARRAY OF CHAR);
BEGIN
DrawTurtle;
SetAPen (Turtle.rp, Turtle.color);
Move (Turtle.rp, int(Turtle.x), int(Turtle.y));
Text (Turtle.rp, ADR(text), Length(text));
DrawTurtle;
END WriteText;
PROCEDURE DrawTo (x, y : INTEGER);
BEGIN
DrawTurtle;
SetAPen (Turtle.rp, Turtle.color);
Move (Turtle.rp, int(Turtle.x), int(Turtle.y));
Draw (Turtle.rp, x, y);
Turtle.x := FFP(x);
Turtle.y := FFP(y);
DrawTurtle;
END DrawTo;
PROCEDURE MoveTo (x, y : INTEGER);
BEGIN
DrawTurtle;
Turtle.x := FFP(x);
Turtle.y := FFP(y);
DrawTurtle;
END MoveTo;
PROCEDURE dDraw (dx, dy : INTEGER);
BEGIN
DrawTurtle;
SetAPen (Turtle.rp, Turtle.color);
Move (Turtle.rp, int(Turtle.x), int(Turtle.y));
Turtle.x := Turtle.x + FFP(dx);
Turtle.y := Turtle.y + FFP(dy);
Draw (Turtle.rp, int(Turtle.x), int(Turtle.y));
DrawTurtle;
END dDraw;
PROCEDURE dMove (dx, dy : INTEGER);
BEGIN
DrawTurtle;
Turtle.x := Turtle.x + FFP(dx);
Turtle.y := Turtle.y + FFP(dy);
DrawTurtle;
END dMove;
PROCEDURE TurtleX () : INTEGER;
BEGIN
RETURN int(Turtle.x);
END TurtleX;
PROCEDURE TurtleY () : INTEGER;
BEGIN
RETURN int(Turtle.y);
END TurtleY;
PROCEDURE TurtleHeading () : INTEGER;
BEGIN
Turtle.heading := Turtle.heading MOD 360;
RETURN Turtle.heading;
END TurtleHeading;
PROCEDURE TurtleSize () : INTEGER;
BEGIN
RETURN Turtle.size;
END TurtleSize;
PROCEDURE TurtleColor () : INTEGER;
BEGIN
RETURN Turtle.color;
END TurtleColor;
PROCEDURE GetColor (x, y : INTEGER) : INTEGER;
BEGIN
RETURN ReadPixel(Turtle.rp, x, y);
END GetColor;
END Turtle.